home *** CD-ROM | disk | FTP | other *** search
- #define IGNORE_STDIO_STUBS
- #define __string_h
-
- #include <PalmOS.h>
- #include <PalmCompatibility.h>
-
- #include <Unix/sys_socket.h>
-
- #include "stringil.h"
- #include "stdio2.h"
-
- #ifdef __PALMOS_TRAPS__
- Err errno;
- #endif
-
- struct prchead {
- char name[32]; //0-32
- short int attr; //32-33
- short int vers; //34-35
- long int cr, md, bkt; //times 36-47
- long int mn, app, sort; // zero 48-59 - zero for prcs.
- long int type, crea; //60-67
- long int uidseed, nxrec; //68-75 - uidseed rand, nxrec zero;
- short int nrecs; //76-78
- };
-
- struct rsrcdbent {
- long int rsrc;
- short int rsid;
- long int ofst; //80+10*(nrecs+index)
- };
-
- struct normdbent {
- long int ofst; //80+8*(nrecs+index)
- unsigned char attr, uid[3];
- };
-
- #define wrtit(buf,len,fd) send(fd, buf, len, 0)
-
- void SendPrc(UInt16 cardno, LocalID lid, unsigned int fd)
- {
- struct prchead head;
- struct rsrcdbent rsrcent;
- struct normdbent dataent;
- unsigned char buf[40];
- LocalID aiid, siid, lid2;
- int i;
- UInt16 attr;
- UInt32 uid, asz, ssz, ofst, t;
- DmOpenRef db;
- void *ap, *sp, *xp;
-
- memset(&head, 0, sizeof(head));
-
- DmDatabaseInfo(cardno, lid, buf, &head.attr, &head.vers, &head.cr, &head.md,
- &head.bkt, &head.mn, &aiid, &siid, &head.type, &head.crea);
-
- strncpy(head.name, buf, 32);
- WinDrawChars(buf, strlen(buf), 0, 15);
-
- asz = 0;
- ssz = 0;
- head.app = 0;
- head.sort = 0;
-
- db = DmOpenDatabase(cardno, lid, dmModeReadOnly);
-
- if (aiid) {
- ap = MemLocalIDToLockedPtr(aiid, cardno);
- asz = MemPtrSize(ap);
- }
- if (siid) {
- sp = MemLocalIDToLockedPtr(siid, cardno);
- ssz = MemPtrSize(sp);
- }
- if (head.attr & dmHdrAttrResDB) {
-
- head.nrecs = DmNumResources(db);
- ofst = 80 + 10 * head.nrecs;
-
- if (asz)
- head.app = ofst;
- if (ssz)
- head.sort = ofst + asz;
- ofst += asz + ssz;
- wrtit(&head, sizeof(head), fd);
-
- for (i = 0; i < head.nrecs; i++) {
-
- DmResourceInfo(db, i, &rsrcent.rsrc, &rsrcent.rsid, &lid2);
- rsrcent.ofst = ofst;
-
- xp = DmGetResourceIndex(db, i);
- uid = MemHandleSize(xp);
- DmReleaseResource(xp);
- ofst += uid;
-
- wrtit(&rsrcent, sizeof(rsrcent), fd);
- }
- uid = 0;
- wrtit(&uid, 2, fd);
-
- if (aiid) {
- wrtit(ap, asz, fd);
- MemPtrUnlock(ap);
- }
- if (siid) {
- wrtit(sp, ssz, fd);
- MemPtrUnlock(sp);
- }
- for (i = 0; i < head.nrecs; i++) {
- ap = DmGetResourceIndex(db, i);
- sp = MemHandleLock(ap);
- uid = MemPtrSize(sp);
-
- ofst = uid;
- while (ofst) {
- #define WRTLIM 2048
- t = wrtit(sp, ofst > WRTLIM ? WRTLIM : ofst, fd);
- sp += t;
- ofst -= t;
- }
-
- MemHandleUnlock(ap);
- DmReleaseResource(ap);
- }
-
- } else {
-
- head.nrecs = DmNumRecords(db);
- ofst = 80 + 8 * head.nrecs;
-
- if (asz)
- head.app = ofst;
- if (ssz)
- head.sort = ofst + asz;
- ofst += asz + ssz;
- wrtit(&head, sizeof(head), fd);
-
- for (i = 0; i < head.nrecs; i++) {
-
- DmRecordInfo(db, i, &attr, &uid, &lid2);
- dataent.attr = attr;
- dataent.uid[0] = uid >> 16;
- dataent.uid[1] = uid >> 8;
- dataent.uid[2] = uid;
- dataent.ofst = ofst;
-
- xp = DmGetRecord(db, i);
- uid = MemHandleSize(xp);
- DmReleaseRecord(db, i, false);
- ofst += uid;
- wrtit(&dataent, sizeof(dataent), fd);
- }
- i = 0;
- wrtit(&i, 2, fd);
-
- if (aiid)
- wrtit(ap, asz, fd);
-
- if (siid)
- wrtit(sp, ssz, fd);
-
- for (i = 0; i < head.nrecs; i++) {
- ap = DmGetRecord(db, i);
- sp = MemHandleLock(ap);
- uid = MemPtrSize(sp);
-
- ofst = uid;
- while (ofst) {
- t = wrtit(sp, ofst > WRTLIM ? WRTLIM : ofst, fd);
- sp += t;
- ofst -= t;
- }
-
- MemHandleUnlock(ap);
- DmReleaseRecord(db, i, false);
- }
-
- }
-
- DmCloseDatabase(db);
-
- }
-
- char httphead1[] =
- "HTTP/1.1 200 OK\nConnection: close\nContent-type: application/octet-stream\n\n";
-
- char httpheadh[] =
- "HTTP/1.1 200 OK\nConnection: close\nContent-type: text/html\n\n";
-
- char httpheadt[] =
- "HTTP/1.1 200 OK\nConnection: close\nContent-type: text/plain\n\n";
-
- char httpheadg[] =
- "HTTP/1.1 200 OK\nConnection: close\nContent-type: image/gif\n\n";
-
- char htmlhead[] =
- "<html><head><title>MyOmniSkyPalmV</title></head><body><table>\n";
- char htmlmid[] = "<tr><th>Database<th>Type<th>Crea<th>NRec<th>Size<th>Attr\n";
- char htmltail[] = "\n</table></body></html>\n";
-
-
- DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
- {
- unsigned char *buf;
- NetSocketAddrType addr;
-
- NetSocketRef fd, fd0;
- int endit;
- Int16 addrlen;
- NetSocketAddrINType *naddr;
- UInt16 cardno;
-
- Err err, err2;
- Byte allup;
- LocalID lid;
- int i;
-
- if (cmd != sysAppLaunchCmdNormalLaunch)
- return 0;
-
- fd = -1, fd0 = -1;
- endit = 0;
- addrlen = sizeof(addr);
- naddr = &addr;
- cardno = 0;
- buf = MemPtrNew(512);
-
- naddr->family = PF_INET;
- naddr->port = 80;
- naddr->addr = 0UL;
-
- AppNetRefnum = 0;
-
- err = SysLibFind("Net.lib", &AppNetRefnum);
- err |= NetLibOpen(AppNetRefnum, &err2);
- NetLibConnectionRefresh(AppNetRefnum, true, &allup, &err2);
-
- // if (err | err2)
- // return 1;
-
- AppNetTimeout = 1000;
-
- fd0 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-
- if (fd0 < 0)
- return 1;
-
- bind(fd0, &addr, addrlen);
- fd = listen(fd0, 1);
- if (fd != 0)
- return 1;
-
- do {
-
- fd = -1;
- AppNetTimeout = 50;
-
- for (;;) {
- WinDrawChars("Wait ", 10, 0, 15);
- {
- EventType e;
- do {
- EvtGetEvent(&e, 0);
- SysHandleEvent(&e);
- if (e.eType == appStopEvent)
- endit = 1;
- } while (e.eType != nilEvent);
- }
- if (endit) {
- WinDrawChars("Exit ", 10, 0, 15);
- break;
- }
- fd = accept(fd0, &addr, &addrlen);
-
- WinDrawChars("Acpt ", 10, 0, 15);
-
- if (fd >= 0)
- break;
-
- }
-
- AppNetTimeout = -1L;
-
- if (fd < 0)
- break;
-
- WinDrawChars("Connect ", 10, 0, 15);
-
- recv(fd, buf, 512, 0);
-
- WinDrawChars(&buf[5], 80, 0, 0);
-
- for (i = 5; i < 40; i++)
- if (!strncmp(&buf[i], " HTTP/1.", 8)) {
- buf[i] = 0;
- if (!strcmp(&buf[i - 4], ".prc"))
- buf[i - 4] = 0;
- if (!strcmp(&buf[i - 4], ".pdb"))
- buf[i - 4] = 0;
- break;
- }
- WinDrawChars(&buf[5], strlen(&buf[5]), 0, 30);
-
- if (buf[5]) {
-
- if (buf[5] == '0' && !buf[6])
- endit = 1;
-
- else {
-
-
- if ((lid = DmFindDatabase(cardno, &buf[5]))) {
- UInt16 attr;
- DmDatabaseInfo(cardno, lid, NULL, &attr, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL);
-
- if (!(attr & dmHdrAttrStream)) {
- send(fd, httphead1, strlen(httphead1), 0);
- SendPrc(0, lid, fd);
- }
- else {
- FILE *ifd;
- unsigned char ibuf[WRTLIM];
- int ic, oc, t;
-
- if (!strcmp(&buf[i - 4], ".gif"))
- send(fd, httpheadg, strlen(httpheadg), 0);
- if (!strcmp(&buf[i - 5], ".html"))
- send(fd, httpheadh, strlen(httpheadh), 0);
- if (!strcmp(&buf[i - 4], ".txt"))
- send(fd, httpheadt, strlen(httpheadt), 0);
- #if 0
- if (!strncmp(buf, "cgi-bin/",8)){
- lid = DmFindDatabase(0, &buf[8]);
- SysUIAppSwitch(0, lid, 0, NULL);
- }
- #endif
- ifd = fopen(&buf[5], "r");
-
- while (!feof(ifd)) {
- ic = fread(ibuf, 1, WRTLIM, ifd);
- if (ic <= 0)
- break;
- oc = 0;
- while (oc < ic) {
- t = wrtit(&ibuf[oc], ic - oc, fd);
- if (t < 0)
- break;
- oc += t;
- }
- }
-
- fclose(ifd);
-
- }
-
- }
- }
- } else {
- send(fd, htmlhead, strlen(htmlhead), 0);
-
- send(fd, htmlmid, strlen(htmlmid), 0);
-
-
- {
- LocalID lid, aiid, siid;
- int i;
- UInt16 cardno = 0;
- // DateTimeType dt;
- char name[36];
-
- UInt16 num, attr, vers;
- UInt32 cr, md, bk, type, crea, mn, nrec, sz;
- num = DmNumDatabases(cardno);
-
- for (i = 0; i < num; i++) {
- lid = DmGetDatabase(cardno, i);
-
- DmDatabaseInfo(cardno, lid, name, &attr, &vers, &cr, &md, &bk, &mn,
- &aiid, &siid, &type, &crea);
-
- memset(buf, 0, 256);
- strcpy(buf, "\n<tr><td><a HREF=\"");
-
- strcat(buf, name);
-
- if (attr & dmHdrAttrResDB)
- strcat(buf, ".prc");
- else if (!(attr & (dmHdrAttrLaunchableData | dmHdrAttrStream))) //PQAs
-
- strcat(buf, ".pdb");
-
- strcat(buf, "\">");
- strcat(buf, name);
- strcat(buf, "</a><td>");
- strncat(buf, &type, 4);
- strcat(buf, "<td>");
- strncat(buf, &crea, 4);
- strcat(buf, "<td>");
-
- DmDatabaseSize(cardno, lid, &nrec, &sz, NULL);
- StrIToA(name, nrec);
- strcat(buf, name);
- strcat(buf, "<td>");
- StrIToA(name, sz);
- strcat(buf, name);
- strcat(buf, "<td>");
- StrIToH(name, attr);
- strcat(buf, &name[4]);
- send(fd, buf, strlen(buf), 0);
- #if 0
- StrIToH(buf, vers);
- send(fd, &buf[4], 4, 0);
- // send(fd, "<td>",4 , 0);
- // TimSecondsToDateTime(cr, &dt);
- #endif
-
- }
- }
- send(fd, htmltail, strlen(htmltail), 0);
- }
-
- WinDrawChars("DONE ", 10, 0, 15);
- close(fd);
- }
- while (!endit);
-
- if (fd0 != -1)
- close(fd0);
-
- err = NetLibClose(AppNetRefnum, true);
- SysTaskDelay(200);
-
- return 0;
- }
-